/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package beans;

import bc.ClienteFacadeLocal;
import bc.DetalleVentaPrendaFacadeLocal;
import bc.PrendaFacadeLocal;
import bc.VentaFacadeLocal;
import be.Cliente;
import be.DetalleVentaPrenda;
import be.DetalleVentaPrendaPK;
import be.Empleado;
import be.EstadoVenta;
import be.Prenda;
import be.Tienda;
import be.TipoVenta;
import be.Venta;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import net.sf.jasperreports.crosstabs.fill.calculation.BucketDefinition.Bucket;
import org.primefaces.event.SelectEvent;

/**
 *
 **Copyright  2011 Yury Daniel Zavaleta De la Cruz
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and  limitations under the License.
 */
@SessionScoped
@ManagedBean
public class ManagedBeanVenta implements  Serializable {
    @EJB
    private ClienteFacadeLocal clienteFacade;
 @EJB
    private PrendaFacadeLocal prendaFacade;
@EJB
    private DetalleVentaPrendaFacadeLocal detalleVentaPrendaFacade;
@EJB
    private VentaFacadeLocal ventaFacade;

 private Date fecha_para_ventas = new Date();
  private Venta venta ;
  private DetalleVentaPrenda detalle_venta_prenda;
 private List<Venta> lista ;
 private List<DetalleVentaPrenda> lista_detalles ;
 private Prenda prenda;
 private List<SelectItem> prendasItems = new LinkedList<SelectItem>();
 private HashMap<Integer, Prenda> myprendas = new HashMap<Integer,Prenda>();

 private List<SelectItem> clientesItems = new LinkedList<SelectItem>();
 private HashMap<Integer, Cliente> myclientes = new HashMap<Integer,Cliente>();


  private List<SelectItem> empleadosItems = new LinkedList<SelectItem>();
 private HashMap<Integer, Empleado> myempleados = new HashMap<Integer,Empleado>();

 private List<Prenda> lista_prendas ;

 private List<Prenda> lista_prendas_totales ;
private List<Cliente> lista_clientes ;


private BigDecimal venta_total_detalles;
  private Date Fecha_venta;
    private Date Fecha_reporte_final;

    private Date fecha_busqueda;

 public List<Prenda> getLista_prendas() {
        return lista_prendas;
    }

    public void setLista_prendas(List<Prenda> lista_prendas) {
        this.lista_prendas = lista_prendas;
    }

    public Date getFecha_reporte_final() {
        return Fecha_reporte_final;
    }

    public void setFecha_reporte_final(Date Fecha_reporte_final) {
        this.Fecha_reporte_final = Fecha_reporte_final;
    }



 private String texto;

    public String getTexto() {
        return texto;
    }

    public void setTexto(String texto) {
        this.texto = texto;
    }

    public Date getFecha_venta() {
        return Fecha_venta;
    }

    public void setFecha_venta(Date Fecha_venta) {
        this.Fecha_venta = Fecha_venta;
    }

 
    public ManagedBeanVenta() {
        venta = new Venta();
        venta.setDetalleVentaPrendaList(new LinkedList<DetalleVentaPrenda>());
        detalle_venta_prenda = new DetalleVentaPrenda();
        lista = new LinkedList<Venta>();
        prenda = new Prenda();
        lista_prendas = new LinkedList<Prenda>();
        lista_detalles = new LinkedList<DetalleVentaPrenda>();
        venta_total_detalles = new BigDecimal(0);
        Fecha_venta = new Date();
        lista_prendas_totales = new LinkedList<Prenda>();
        fecha_busqueda = new Date();
        
    }

    public DetalleVentaPrenda getDetalle_venta_prenda() {
        return detalle_venta_prenda;
    }

    public void setDetalle_venta_prenda(DetalleVentaPrenda detalle_venta_prenda) {
        this.detalle_venta_prenda = detalle_venta_prenda;
    }

    public Date getFecha_busqueda() {
        return fecha_busqueda;
    }

    public void setFecha_busqueda(Date fecha_busqueda) {
        this.fecha_busqueda = fecha_busqueda;
    }

    

    public Venta getVenta() {
        return venta;
    }

    public void setVenta(Venta venta) {
        this.venta = venta;
    }

public String Cambios(){
    return "cambios";
}



public String Cobros(){
    return "cobros_ventas";
}


public String Precios(){
    return "precios";
}
public String Almacen(){
return "almacen";
}


    public String Nueva_venta(){
    venta = new Venta();
 
    

    // Aqui tienes que agregar al empleado de la empresa que usa el sistema en ese momento
    venta.setEmpleado(new Empleado(1));
    venta.setEstadoVenta(new EstadoVenta(1));
    venta.setObservaciones("");
    venta.setTienda(new Tienda(1));
    venta.setTipoVenta(new TipoVenta(1));
    venta.setTotalVenta(new BigDecimal("0"));
    venta.setFechaVenta(fecha_para_ventas);
    venta.setFechaVentaEmision(fecha_para_ventas);
    venta.setTotalPagosCredito(new BigDecimal(0));
     lista_detalles = new LinkedList<DetalleVentaPrenda>();
    detalle_venta_prenda = new DetalleVentaPrenda();
    detalle_venta_prenda.setCantidad(1);
    detalle_venta_prenda.setVenta(venta);
   
    detalle_venta_prenda.setDescuento(BigDecimal.ZERO);
    lista_prendas = new LinkedList<Prenda>();
venta_total_detalles = new BigDecimal(0);
     return "nueva_venta";
    }


      public String Nueva_ventaFactura(){
    venta = new Venta();



    // Aqui tienes que agregar al empleado de la empresa que usa el sistema en ese momento
    venta.setEmpleado(new Empleado(1));
    venta.setEstadoVenta(new EstadoVenta(1));
    venta.setObservaciones("");
    venta.setTienda(new Tienda(1));
    venta.setTipoVenta(new TipoVenta(2));
    venta.setTotalVenta(new BigDecimal("0"));
    venta.setFechaVenta(fecha_para_ventas);
    venta.setFechaVentaEmision(fecha_para_ventas);
 venta.setTotalPagosCredito(new BigDecimal(0));
     lista_detalles = new LinkedList<DetalleVentaPrenda>();
    detalle_venta_prenda = new DetalleVentaPrenda();
    detalle_venta_prenda.setCantidad(1);
    detalle_venta_prenda.setVenta(venta);

    detalle_venta_prenda.setDescuento(BigDecimal.ZERO);
    lista_prendas = new LinkedList<Prenda>();
venta_total_detalles = new BigDecimal(0);
     return "nueva_venta_factura";
    }


    public String editar_guardar_venta(){
              try {

   //  this.calcular_total_venta();
    // venta.setEstadoVenta(new EstadoVenta(1));
     venta.setTotalVenta(this.calcular_total_venta());
     venta.setDetalleVentaPrendaList(lista_detalles);
     ventaFacade.edit(venta);
                          } catch (Exception e) {
            e.printStackTrace();
        }
                    return "felcitaciones";
    }

    public String editar_guardar_ventaFactura(){
              try {

   //  this.calcular_total_venta();
    // venta.setEstadoVenta(new EstadoVenta(1));
     venta.setTotalVenta(this.calcular_total_venta());
     venta.setDetalleVentaPrendaList(lista_detalles);
     ventaFacade.edit(venta);
                          } catch (Exception e) {
            e.printStackTrace();
        }
                    return "felcitacionesfac";
    }

 

    public List<DetalleVentaPrenda> getListaDetalles(){
       if(venta.getDetalleVentaPrendaList()==null){
        venta.setDetalleVentaPrendaList(new LinkedList<DetalleVentaPrenda>());
         return venta.getDetalleVentaPrendaList();
       }else{
     return venta.getDetalleVentaPrendaList();
        }

    }
public void AgregarDetallePrenda(){
    //Solo cuando es nulo
if(venta.getIdVenta()==null){
//venta.setIdVenta(100);
ventaFacade.create(venta);
}
if(Existe_duplicado_detalle(detalle_venta_prenda)) {
       FacesMessage msg = new FacesMessage("Duplicado", "El Producto ya ha sido Ingresado");
            FacesContext.getCurrentInstance().addMessage(null, msg);
}
else {
 BigDecimal cantidad =  new BigDecimal(detalle_venta_prenda.getCantidad());
 detalle_venta_prenda.setSubTotal((detalle_venta_prenda.getPrecioVenta().subtract(detalle_venta_prenda.getDescuento())).multiply(cantidad));
    DetalleVentaPrenda dt = new DetalleVentaPrenda();
 dt = detalle_venta_prenda;
 dt.setDetalleVentaPrendaPK(new DetalleVentaPrendaPK(venta.getIdVenta(), detalle_venta_prenda.getPrenda().getIdPrenda()));
 // Prueba Aqui
 dt.setVenta(venta);
 lista_detalles.add(dt);
    Prenda p = new Prenda();
    p = detalle_venta_prenda.getPrenda();
    detalle_venta_prenda = new DetalleVentaPrenda();
    detalle_venta_prenda.setPrenda(p);
    detalle_venta_prenda.setCantidad(1);
detalle_venta_prenda.setDescuento(new BigDecimal("0"));
detalle_venta_prenda.setPrecioVenta(new BigDecimal("0"));
venta_total_detalles = this.calcular_total_venta();
// te quedaste aqui
}



}




public void AgregarDetallePrenda_Mejorado(){
    //Solo cuando es nulo
if(venta.getIdVenta()==null){
//venta.setIdVenta(100);
ventaFacade.create(venta);
}
if(Existe_duplicado_detalle(detalle_venta_prenda)) {
       FacesMessage msg = new FacesMessage("Duplicado", "El Producto ya ha sido Ingresado");
            FacesContext.getCurrentInstance().addMessage(null, msg);
}
else {
 BigDecimal cantidad =  new BigDecimal(detalle_venta_prenda.getCantidad());
 detalle_venta_prenda.setSubTotal((detalle_venta_prenda.getPrecioVenta().subtract(detalle_venta_prenda.getDescuento())).multiply(cantidad));
  detalle_venta_prenda.setDetalleVentaPrendaPK(new DetalleVentaPrendaPK(venta.getIdVenta(), detalle_venta_prenda.getPrenda().getIdPrenda()));

 detalle_venta_prenda.setVenta(venta);
 lista_detalles.add(detalle_venta_prenda);
 venta.getDetalleVentaPrendaList().add(detalle_venta_prenda);


 Prenda p = new Prenda();
    p = detalle_venta_prenda.getPrenda();
    detalle_venta_prenda = new DetalleVentaPrenda();
    detalle_venta_prenda.setPrenda(p);
    detalle_venta_prenda.setCantidad(1);
detalle_venta_prenda.setDescuento(new BigDecimal("0"));
detalle_venta_prenda.setPrecioVenta(new BigDecimal("0"));
venta_total_detalles = this.calcular_total_venta();
// te quedaste aqui
}



}



public void EliminarLista(){
    try {
        venta_total_detalles = venta_total_detalles.subtract(detalle_venta_prenda.getSubTotal());
        lista_detalles.remove(detalle_venta_prenda);
    } catch (Exception e) {
        e.printStackTrace();
    }

}
public Boolean Existe_duplicado_detalle(DetalleVentaPrenda det){
    for (DetalleVentaPrenda dt : lista_detalles){
if(dt.getPrenda().getIdPrenda()==det.getPrenda().getIdPrenda()){
return true;
}
}
    return false;
}
public void insertar_detalles_prenda(){

    try {
         venta.setDetalleVentaPrendaList(lista_detalles);
    } catch (Exception e) {
    }
    

}
public List<String> complete(String nombre) {
        List<String> results = new ArrayList<String>();

            for(Prenda p : prendaFacade.findAll()){
    if (p.getNombrePrenda().toUpperCase().indexOf(nombre.toUpperCase())!=-1){
    results.add(p.getNombrePrenda());
    }
    }
        return results;
    }

public List<Prenda> completar_filtrado_prenda(String nombre) {
  lista_prendas = new LinkedList<Prenda>();
  for(Prenda p : prendaFacade.findAll()){
  
  myprendas.put(p.getIdPrenda(), p);
    if (p.getNombrePrenda().toUpperCase().indexOf(nombre.toUpperCase())!=-1){
    lista_prendas.add(p);
    
    }
    }
       return lista_prendas;
    }

public List<Prenda>  Traer_Lista_Prenda_Total(){
    if(lista_prendas_totales.isEmpty() || lista_prendas_totales==null){
    lista_prendas_totales = prendaFacade.findAll();
    }
    return lista_prendas_totales;

}

public List<Cliente> completar_filtrado_Clientes(String nombre) {
  lista_clientes = new LinkedList<Cliente>();
            for(Cliente p : clienteFacade.findAll()){
                 myclientes.put(p.getIdCliente(), p);
    if (p.getNombreCliente().toUpperCase().indexOf(nombre.toUpperCase())!=-1){
    lista_clientes.add(p);

    }
    }
       return lista_clientes;
    }




public List<Venta> getListaVentas() {
 // lista= new LinkedList<Venta>();
    if(lista==null){
     lista = ventaFacade.findAll();
    }
        
      return lista;
    }


public List<Venta> getListaFiltradaVentas() {
 // lista= new LinkedList<Venta>();
BigDecimal cero = new BigDecimal(BigInteger.ZERO);
int comp;
    lista.clear();
    try {
        for(Venta v : ventaFacade.findAll())
              {
             comp = v.getTotalVenta().compareTo(cero);
            if(v.getEstadoVenta().getIdEstadoVenta()==2 && (comp ==1) ){
            lista.add(v);
            }
               }
    } catch (Exception e) {
        e.printStackTrace();
    }
      return lista;
    }
    public List<Venta> getLista() {
        return lista;
    }

    public void setLista(List<Venta> lista) {
        this.lista = lista;
    }



public List<String> complete2(String nombre) {

     lista_prendas = new LinkedList<Prenda>();
     List<String> resultado = new LinkedList<String>();
this.llenar_prendas();
            for(Prenda p : prendaFacade.findAll()){
    if (p.getNombrePrenda().toUpperCase().indexOf(nombre.toUpperCase())!=-1){
    lista_prendas.add(p);
    resultado.add(p.getNombrePrenda());
    }
    }
    return resultado;

    }




    public void handleSelect(SelectEvent event) {
      FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Selected:" + event.getObject().toString(), null);
    FacesContext.getCurrentInstance().addMessage(null, message);
}

    public HashMap<Integer, Prenda> getMyprendas() {
        return myprendas;
    }

    public void setMyprendas(HashMap<Integer, Prenda> myprendas) {
        this.myprendas = myprendas;
    }

    public Prenda getPrenda() {
        return prenda;
    }

    public void setPrenda(Prenda prenda) {
        this.prenda = prenda;
    }

    public List<DetalleVentaPrenda> getLista_detalles() {
        return lista_detalles;
    }

    public void setLista_detalles(List<DetalleVentaPrenda> lista_detalles) {
        this.lista_detalles = lista_detalles;
    }

   public List<SelectItem> getPrendasItems() {
          lista_prendas = new ArrayList<Prenda>();
        prendasItems = new LinkedList<SelectItem>();
        lista_prendas = prendaFacade.findAll();
        for(Prenda p: lista_prendas){
        myprendas.put(p.getIdPrenda(), p);
            prendasItems.add(new SelectItem(p, p.getNombrePrenda()));
        }

        return prendasItems;

    }

   public void llenar_prendas(){
                for(Prenda p: prendaFacade.findAll()){
        myprendas.put(p.getIdPrenda(), p);
        }
   }

    public BigDecimal calcular_total_venta(){
        BigDecimal total_venta = new  BigDecimal(0);
        if (lista_detalles == null){
            
        return total_venta;
        }
 else{
                for(DetalleVentaPrenda dt: lista_detalles){
//venta.setTotalVenta( venta.getTotalVenta().add(dt.getSubTotal()));
total_venta = total_venta.add(dt.getSubTotal());
                    }
                 
                return total_venta;
        }
   }

     


    public Cliente getDevuelve_Cliente(Integer id) {
    return (Cliente) myclientes.get(id);
     }

 public Prenda getDevuelve_Prenda(Integer id) {
    return (Prenda) myprendas.get(id);
     }
    public void setPrendasItems(List<SelectItem> prendasItems) {
        this.prendasItems = prendasItems;
    }

    public BigDecimal getVenta_total_detalles() {
        return venta_total_detalles;
    }

    public void setVenta_total_detalles(BigDecimal venta_total_detalles) {
        this.venta_total_detalles = venta_total_detalles;
    }




    public String getTest_devuelve_fecha_string(){

        Date dateNow = new Date ();

        SimpleDateFormat dateformatDDMMYYYY = new SimpleDateFormat("dd/MM/yyyy");
       

        StringBuilder nowDDMMYYYY = new StringBuilder( dateformatDDMMYYYY.format( Fecha_venta ) );
        
    return nowDDMMYYYY.toString();
    }


    public String getTest_encontro_fecha_string(){
 SimpleDateFormat fecha_buscar = new SimpleDateFormat("dd/MM/yyyy");
  SimpleDateFormat fecha_detalle = new SimpleDateFormat("dd/MM/yyyy");
   StringBuilder cadena_fecha_buscar = new StringBuilder( fecha_buscar.format( Fecha_venta ) );
        for (Venta v : ventaFacade.findAll()){

            StringBuilder cadena_fecha_detalle = new StringBuilder( fecha_detalle.format( v.getFechaVenta() ) );
        if(cadena_fecha_buscar.toString().equals(cadena_fecha_detalle.toString()))
            return "Si";
        }
        return "No";
    }

/*
     public void Filtrar_lista_busqueda(){
         lista= new LinkedList<Venta>();
       //  lista = ventaFacade.findAll();
    //  return lista;
 SimpleDateFormat fecha_buscar = new SimpleDateFormat("dd/MM/yyyy");
  SimpleDateFormat fecha_detalle = new SimpleDateFormat("dd/MM/yyyy");
   StringBuilder cadena_fecha_buscar = new StringBuilder( fecha_buscar.format( Fecha_venta ) );
        for (Venta v : ventaFacade.findAll()){

            StringBuilder cadena_fecha_detalle = new StringBuilder( fecha_detalle.format( v.getFechaVenta() ) );
        if(cadena_fecha_buscar.toString().equals(cadena_fecha_detalle.toString()))
            lista.add(v);
        }
      
    }

     */

  public void Filtrar_lista_busqueda(){
         lista= new LinkedList<Venta>();

     
        for (Venta v : ventaFacade.findAll()){

   
            if(  v.getFechaVenta().equals(Fecha_venta) || v.getFechaVenta().equals(Fecha_reporte_final)   ||  (v.getFechaVenta().after(Fecha_venta) & v.getFechaVenta().before(Fecha_reporte_final)) ){
            lista.add(v);
        
                        }
        }


    }




  public void Filtrar_lista_busqueda_mejorada(){
         lista= new LinkedList<Venta>();
        for (Venta v : ventaFacade.findAll()){
            if(v.getFechaVenta().equals(Fecha_reporte_final)  ){
            lista.add(v);
          }
        }
    }



     public String Volver_Venta(){
     venta = new Venta();
     return "ventas?faces-redirect=true";
     }

  
}
